Реализуйте
структуру данных “стек”. Напишите
программу, содержащую описание стека и моделирующую работу стека, реализовав
все указанные методы. Программа считывает последовательность команд и в
зависимости от команды выполняет ту или иную операцию. После выполнения каждой
команды программа должна вывести одну строку. Возможные команды для программы:
·
push n
– Добавьте в стек число n (значение n
задается после команды). Выведите ok.
·
pop – Удалите из стека последний элемент. Выведите его значение.
·
back – Выведите значение последнего
элемента, не удаляя его из стека.
·
size – Выведите количество элементов в
стеке.
·
clear – Очистите стек и выведите ok.
·
exit – Выведите bye и завершите
работу.
Гарантируется,
что набор входных команд удовлетворяет следующим требованиям: максимальное
количество элементов в стеке в любой момент не превосходит 100, все команды pop
и back корректны, то есть при их исполнении в стеке содержится хотя бы
один элемент.
Вход. Каждая строка
содержит одну команду.
Выход. Для каждой команды
выведите в отдельной строке соответствующий результат.
Пример
входа |
Пример
выхода |
push 2 push 3 push 5 back size pop size push 7 pop clear size exit |
ok ok ok 5 3 5 2 ok 7 ok 0 bye |
стек
В задаче следует
промоделировать работу стека.
#include <cstdio>
#include <cstring>
#include <stack>
using namespace
std;
stack<int> s;
char str[100];
int n;
int main(void)
{
while(scanf("%s",str))
{
if
(strcmp(str,"push") == 0)
{
scanf("%d",&n);
s.push(n);
puts("ok");
} else
if
(strcmp(str,"pop") == 0)
{
printf("%d\n",s.top());
s.pop();
} else
if
(strcmp(str,"back") == 0)
{
printf("%d\n",s.top());
} else
if (strcmp(str,"size")
== 0)
{
printf("%d\n",s.size());
} else
if
(strcmp(str,"clear") == 0)
{
while(!s.empty())
s.pop();
puts("ok");
} else
{
puts("bye");
break;
}
}
return 0;
}
Объявим рабочий стек.
stack<int> s;
Читаем команду str. Команды читаем до конца файла.
while(cin >> str)
{
if (str == "push")
{
Команда push. Читаем число n и заносим его в стек. Выводим сообщение “ok”.
cin >> n;
s.push(n);
cout
<< "ok" << endl;
} else
if (str == "pop")
{
Команда pop. Выводим число на вершине стека. Удаляем верхний элемент.
cout << s.top() << endl;
s.pop();
} else
if (str == "back")
{
Команда top. Выводим число на вершине стека.
cout << s.top() << endl;
} else
if (str == "size")
{
Команда size. Выводим размер стека.
cout << s.size() << endl;
} else
if (str == "clear")
{
Команда clear. Удаляем весь стек. Поскольку С++ не имеет для стека метода
clear, то приходится последовательно
удалять элементы стека один за другим.
while(!s.empty())
s.pop();
cout << "ok"
<< endl;
} else
{
Команда exit. Выводим “bye” и завершаем работу программы.
cout << "bye"
<< endl;
break;
}
}
return 0;
}
Объявим класс Стек и его методы.
class Stack {
public:
Stack(int
_size);
~Stack();
void push(int v);
int pop();
int back();
int size();
void clear();
void exit();
private:
int* m;
int _size;
};
Stack::Stack(int _size = 110) {
m = new int[_size];
this->_size
= 0;
}
Stack::~Stack()
{
delete[] m;
}
void Stack::push(int
v) {
m[_size++] = v;
puts("ok");
}
int Stack::pop() {
return
m[--_size];
}
int Stack::back() {
return
m[_size-1];
}
int Stack::size() {
return _size;
}
void Stack::clear() {
_size = 0;
puts("ok");
}
void Stack::exit() {
puts("bye");
}
Основная часть
программы. Моделируем работу стека.
Stack s;
while(scanf("%s",&str))
{
if
(strcmp(str,"push") == 0)
{
scanf("%d",&n);
s.push(n);
} else
if
(strcmp(str,"pop") == 0)
{
printf("%d\n",s.pop());
} else
if
(strcmp(str,"back") == 0)
{
printf("%d\n",s.back());
} else
if
(strcmp(str,"size") == 0)
{
printf("%d\n",s.size());
} else
if
(strcmp(str,"clear") == 0)
{
s.clear();
} else
{
s.exit();
break;
}
}
Java реализация – статический массив
import java.util.*;
//import java.io.*;
class Stack
{
private int m[];
private int size;
public Stack(int size)
{
m = new int[size];
this.size = 0;
}
public void push(int v)
{
m[size++] = v;
System.out.println("ok");
}
public int pop()
{
return m[--size];
}
public int back()
{
return m[size-1];
}
public int size()
{
return size;
}
public void clear()
{
size = 0;
System.out.println("ok");
}
public void exit()
{
System.out.println("bye");
}
}
public class Main
{
public static void main(String[] args) //throws IOException
{
Stack s = new Stack(110);
//Scanner con = new Scanner(new FileReader
("6122.in"));
Scanner
con = new Scanner(System.in);
while(true)
{
String str = con.next();
if (str.equals("push"))
{
int n = con.nextInt();
s.push(n);
} else
if (str.equals("pop"))
{
System.out.println(s.pop());
} else
if (str.equals("back"))
{
System.out.println(s.back());
} else
if (str.equals("size"))
{
System.out.println(s.size());
} else
if (str.equals("clear"))
{
s.clear();
} else
{
s.exit();
break;
}
}
con.close();
}
}
Java реализация – встроенный стек
import java.util.*;
//import java.io.*;
public class Main
{
public static void main(String[] args) //throws IOException
{
Stack<Integer> s = new Stack<Integer>();
//Scanner con = new Scanner(new FileReader
("6122.in"));
Scanner con = new Scanner(System.in);
while(true)
{
String str = con.next();
if (str.equals("push"))
{
int n = con.nextInt();
s.push(n);
System.out.println("ok");
} else
if (str.equals("pop"))
{
System.out.println(s.pop());
} else
if (str.equals("back"))
{
System.out.println(s.peek());
} else
if (str.equals("size"))
{
System.out.println(s.size());
} else
if (str.equals("clear"))
{
s.clear();
System.out.println("ok");
} else
{
System.out.println("bye");
break;
}
}
con.close();
}
}
Java реализация – LinkedList
import java.util.*;
//import java.io.*;
class Stack
{
private
LinkedList<Integer> m;
public Stack()
{
m = new LinkedList<Integer>();
}
public void push(int v)
{
m.add(v);
System.out.println("ok");
}
public int pop()
{
int val = m.getLast();
m.removeLast();
return val;
}
public int back()
{
return m.getLast();
}
public int size()
{
return m.size();
}
public void clear()
{
m.clear();
System.out.println("ok");
}
public void exit()
{
System.out.println("bye");
}
}
public class Main
{
public static void main(String[] args) //throws IOException
{
Stack s = new Stack();
//Scanner con = new Scanner(new FileReader
("6122.in"));
Scanner
con = new Scanner(System.in);
while(true)
{
String str = con.next();
if (str.equals("push"))
{
int n = con.nextInt();
s.push(n);
} else
if (str.equals("pop"))
{
System.out.println(s.pop());
} else
if (str.equals("back"))
{
System.out.println(s.back());
} else
if (str.equals("size"))
{
System.out.println(s.size());
} else
if (str.equals("clear"))
{
s.clear();
} else
{
s.exit();
break;
}
}
con.close();
}
}
Java реализация – расширенный стек
import java.util.*;
class MyStack
{
protected Vector<Integer> v;
MyStack()
{
v = new
Vector<Integer>();
}
public void push(int x)
{
v.add(x);
}
public int pop()
{
int last = v.lastElement();
v.remove(v.size() - 1);
return last;
}
}
class NewStack extends MyStack
{
public void push(int x)
{
super.push(x);
System.out.println("ok");
}
/*
public int pop() // pop is totally the same as in superclass
{
return super.pop();
}
*/
public int back()
{
return v.get(v.size() - 1);
// v is visible from subclass, it is protected
}
public int size()
{
return v.size();
}
public void clear()
{
v.clear();
System.out.println("ok");
}
public void exit()
{
System.out.println("bye");
}
}
public class Main
{
public static void main(String[] args)
{
Scanner con = new Scanner(System.in);
NewStack s = new NewStack();
while(true)
{
String str = con.next();
if (str.equals("push"))
{
int n = con.nextInt();
s.push(n);
} else
if (str.equals("pop"))
{
System.out.println(s.pop());
} else
if (str.equals("back"))
{
System.out.println(s.back());
} else
if (str.equals("size"))
{
System.out.println(s.size());
} else
if (str.equals("clear"))
{
s.clear();
} else
{
s.exit();
break;
}
}
con.close();
}
}
Python реализация
import sys
stack = []
for str in
sys.stdin:
lst = list(str.split())
if
lst[0] == "push":
n = int(lst[1]);
stack.append(n);
print("ok")
elif
lst[0] == "pop":
print(stack.pop())
elif
lst[0] == "back":
print(stack[-1])
elif
lst[0] == "size":
print(len(stack))
elif
lst[0] == "clear":
stack.clear()
print("ok")
else:
print("bye")
break;